#include"../source/server.hpp"

EventLoop base_loop;
LoopThreadPool* pool;
//管理所有的连接
std::unordered_map<int,PtrConnection> _conns;
int conn_id=0;
void ConnectionDestroy(const PtrConnection& conn){
    _conns.erase(conn->Id());
}
void OnConnected(const PtrConnection& conn){
    DEB_LOG("New conntection:%p",conn.get());
}
void OnMessage(const PtrConnection& conn,Buffer* buffer){
    DEB_LOG("%s",buffer->ReadPosition());
    buffer->MoveReadOffset(buffer->ReadAbleSize());
    std::string str="This is an apple!";
    conn->Send(str.c_str(),str.size());
    // conn->Shutdown();   //这个开启的话，调用一次这个函数后这个tcp连接就会断开
}
void Accept(int fd){
    conn_id++;
    PtrConnection conn(new Connection((pool->NextLoop()),conn_id,fd));
    //这里必须动态开辟，因为我们需要传指针给回调函数，且 HandleClose 还要对这个对象进行销毁，如果不动态开辟空间
    //直接创建一个对象，那么它就存在在栈空间上，不能够使用 delete 销毁
    conn->SetMessageCallback(std::bind(&OnMessage,std::placeholders::_1,std::placeholders::_2));
    conn->SetsvrCloseCallback(std::bind(&ConnectionDestroy,std::placeholders::_1));
    conn->SetConnectedCallback(std::bind(&OnConnected,std::placeholders::_1));
    //非活跃连接的超时释放操作，10秒后关闭连接
    //注意定时销毁任务，必须在启动读事件监控之前，以防止我们读事件监控刚启动就有读事件，而我们的定时销毁任务还没有启动而没有刷新定时销毁任务
    conn->EnableInactiveRelease(10);
    conn->Established();
    _conns.insert(std::make_pair(conn_id,conn));
    DEB_LOG("NEW ---------------------");
}
int main(){
    //测试：poller与channel模块联合测试
    // Pool poller;
    pool=new LoopThreadPool(&base_loop);
    pool->SetThreadCount(2);
    pool->Create();
    Acceptor acceptor(&base_loop,8080);
    acceptor.SetAcceptCallbakc(std::bind(&Accept,std::placeholders::_1));
    acceptor.Listen();
    TimerWheel timer(&base_loop);
    base_loop.Start();


    // Socket svr_sock;
    // assert(svr_sock.CreateServer(8080));
    // while(1){
    //     int newfd=svr_sock.Accept();
    //     if(newfd<0){
    //         continue;
    //     }
    //     std::cout<<"get a link!\n";
    //     Socket new_sock(newfd);
    //     while(true){
    //     char buf[1024];
    //     int ret=new_sock.Recv(buf,1023);
    //     if(ret<0){
    //         new_sock.Close();
    //         std::cout<<"recv ret < 0\n";
    //         continue;
    //     }
    //     buf[ret]='\0';
    //     DEB_LOG("%s",buf);
    //     new_sock.Send(buf,ret);
    // }
    //     new_sock.Close();
    // }
    // svr_sock.Close();
    return 0;
}
